{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Predict student admission based on marks in two exams\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Exam1</th>\n",
       "      <th>Exam2</th>\n",
       "      <th>Admitted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34.623660</td>\n",
       "      <td>78.024693</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30.286711</td>\n",
       "      <td>43.894998</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>35.847409</td>\n",
       "      <td>72.902198</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>60.182599</td>\n",
       "      <td>86.308552</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>79.032736</td>\n",
       "      <td>75.344376</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Exam1      Exam2  Admitted\n",
       "0  34.623660  78.024693         0\n",
       "1  30.286711  43.894998         0\n",
       "2  35.847409  72.902198         0\n",
       "3  60.182599  86.308552         1\n",
       "4  79.032736  75.344376         1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#load file data\n",
    "import os\n",
    "path=os.getcwd()#gets current working directory\n",
    "path=path+'/andrew_ng_data/exercise2'\n",
    "data=pd.read_csv(path,header=None,names=['Exam1','Exam2','Admitted'])\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "positive=data[data['Admitted'].isin([1])]\n",
    "negative=data[data['Admitted'].isin([0])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Exam1</th>\n",
       "      <th>Exam2</th>\n",
       "      <th>Admitted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>60.182599</td>\n",
       "      <td>86.308552</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>79.032736</td>\n",
       "      <td>75.344376</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>61.106665</td>\n",
       "      <td>96.511426</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>75.024746</td>\n",
       "      <td>46.554014</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>76.098787</td>\n",
       "      <td>87.420570</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Exam1      Exam2  Admitted\n",
       "3  60.182599  86.308552         1\n",
       "4  79.032736  75.344376         1\n",
       "6  61.106665  96.511426         1\n",
       "7  75.024746  46.554014         1\n",
       "8  76.098787  87.420570         1"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "positive.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Exam1</th>\n",
       "      <th>Exam2</th>\n",
       "      <th>Admitted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34.623660</td>\n",
       "      <td>78.024693</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30.286711</td>\n",
       "      <td>43.894998</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>35.847409</td>\n",
       "      <td>72.902198</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>45.083277</td>\n",
       "      <td>56.316372</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>95.861555</td>\n",
       "      <td>38.225278</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Exam1      Exam2  Admitted\n",
       "0   34.623660  78.024693         0\n",
       "1   30.286711  43.894998         0\n",
       "2   35.847409  72.902198         0\n",
       "5   45.083277  56.316372         0\n",
       "10  95.861555  38.225278         0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "negative.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'Exam2 score')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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PeUpT9Hu3bt18803a8+ePRoaGtJdd92l3bt366ijjtLNN9+sQ4cO6corr9Rdd92lnTt3zlna0izCNVKLP7hAMezdO/kCerrx8bDVM1B4bWy/+9SnPlVvfetbdd111005/m//9m9685vfLEm69NJLtbOBt41HR0f1zGc+U0uWLNF5552ne+65R48++qgef/xxPf744zr77LOPfL1q55xzjkqlkhYtWqSnPe1pet3rXidJev7zn6/9+/fP6/9z++23a9euXXrxi1+sFStW6Pbbb9cPf/hD3X333XrFK16hRYsW6ZhjjtHAwMC8vm6jCNdILf7gomiKur5g+XKpu7v2bd3d0rJlnR0PkEptbr+7fv16XX/99S3XSG/btk3333+/li5dqmc961n6xS9+oc9+9rNzft6xxx575OOurq4j17u6uvTkk0/Oawzurssuu0y7d+/W7t279f3vf3/ORZpxIlwjtfiDiyIp8vqCgYHwLnctXV3hdsytqC/OCqED7Xef8Yxn6OKLL9b1119/5NjLXvYyffrTn5Yk3XzzzfrDP/xDSVKpVFK5xgNsYmJCt9xyi+69917t379f+/fv12233aZt27bp+OOP1/HHH39k9vvmm29uabzTx3D00UfriSeekCSdd955uvXWW/XQQw9Jkh599FE98MAD+oM/+AN99atf1SOPPKInnnhCn/nMZ1oaQz2Ea6QWf3CRN/XCT9HXF5RK0o4d4TJ6Qd3dPXm8pyfZ8WVBkV+cFUKH2u++5z3vmdI15CMf+YhuuOEGnXHGGfrHf/xHDQ4OSpIuueQSfehDH9ILXvCCKQsav/71r2vx4sU6+eSTjxw7++yzdd999+nQoUO64YYbdPnll2vFihXyFl8QrF27VhdccIHOOeecI9fPOOMMveUtb9Fpp52mv/qrv9L555+vM844Q6961at06NAhnXTSSfrABz6gs846Sy9/+cv13Oc+t6Ux1GOt/ueS1Nvb66Ojo0kPA220c2cIFxMTIWx0d4dgvWOH1NeX9OiAxs32WL7//hCGar0b290d/nauWdP5MXfa2FhYS7FvX3hnamCAYN2IcjkE6Voz1aWSdPAg5zGt9uzZ01jAcw8Bur9/ao11veNoWa2fjZntcvfeuT53QdtGBcSgry/8YeAPLrKsemY6EgXpVaukd7yD9QVS+L3uxIuIcjk8p+zdG8rP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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax=plt.subplots(figsize=(12,8))\n",
    "ax.scatter(positive['Exam1'],positive['Exam2'],s=50,marker='o',c='b',label='Admitted')\n",
    "ax.scatter(negative['Exam1'],negative['Exam2'],s=50,marker='x',c='r',label='Not Admitted')\n",
    "ax.legend()\n",
    "ax.set_xlabel('Exam1 score')\n",
    "ax.set_ylabel('Exam2 score')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(z):#activation function for output of logistic regression, it converts continuous input into a value between 0 and 1\n",
    "    return 1/(1+np.exp(-z))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fd04eb87048>]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nums=np.arange(-10,10,step=1)\n",
    "fig, ax=plt.subplots(figsize=(12,8))\n",
    "ax.plot(nums, sigmoid(nums),'r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "#define cost function\n",
    "def cost(theta,X,y):\n",
    "    X=np.matrix(X)\n",
    "    y=np.matrix(y)\n",
    "    theta=np.matrix(theta)\n",
    "    first_term=np.multiply(-y,np.log(sigmoid(X*theta.T)))\n",
    "    second_term=np.multiply((1-y),np.log(1-sigmoid(X*theta.T)))\n",
    "    return np.sum(first_term-second_term)/(len(X))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#add ones column\n",
    "data.insert(0,'Ones',1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#set X,y\n",
    "cols=data.shape[1]\n",
    "X=data.iloc[:,0:cols-1]\n",
    "y=data.iloc[:,cols-1:cols]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "#initialize parameter arrays\n",
    "X=np.array(X.values)\n",
    "y=np.array(y.values)\n",
    "theta=np.zeros(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((100, 3), (100, 1), (3,))"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape, y.shape, theta.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6931471805599453"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cost(theta,X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient(theta,X,y):\n",
    "    theta=np.matrix(theta)\n",
    "    X=np.matrix(X)\n",
    "    y=np.matrix(y)\n",
    "    parameters=int(theta.ravel().shape[1])\n",
    "    grad=np.zeros(parameters)\n",
    "    error=sigmoid(X*theta.T)-y\n",
    "    for i in range(parameters):\n",
    "        term=np.multiply(error,X[:,i])\n",
    "        grad[i]=np.sum(term)/len(X)\n",
    "    return grad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.20349770158947458"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import scipy.optimize as opt  \n",
    "result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))  \n",
    "cost(result[0], X, y) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(theta,X):\n",
    "    probability=sigmoid(X*theta.T)\n",
    "    return [1 if x>=0.5 else 0 for x in probability]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy=89%\n"
     ]
    }
   ],
   "source": [
    "theta_min=np.matrix(result[0])\n",
    "predictions=predict(theta_min,X)\n",
    "correct = [1 if ((a==1)and b==1) or (a==0 and b==0) else 0 for (a,b) in zip(predictions,y)]\n",
    "accuracy=(sum(map(int,correct))%len(correct))\n",
    "print ('accuracy={0}%'.format(accuracy))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
